From 72cc91540e0f2601573222e4398b6197a80ff943 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 2 Jun 2011 14:39:50 +0100 Subject: [PATCH] x86: Hide CPUID leaf 7 from PV guests. Except for the whitelisted FSGSBASE feature. Signed-off-by: Keir Fraser --- tools/libxc/xc_cpufeature.h | 3 +++ tools/libxc/xc_cpuid_x86.c | 10 +++++++++- xen/arch/x86/traps.c | 7 +++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tools/libxc/xc_cpufeature.h b/tools/libxc/xc_cpufeature.h index 5263774ab3..d8bb6cb27f 100644 --- a/tools/libxc/xc_cpufeature.h +++ b/tools/libxc/xc_cpufeature.h @@ -141,4 +141,7 @@ #define X86_FEATURE_TBM (6*32+21) /* trailing bit manipulations */ #define X86_FEATURE_TOPOEXT (6*32+22) /* topology extensions CPUID leafs */ +/* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx), word 9 */ +#define X86_FEATURE_FSGSBASE (7*32+ 0) /* {RD,WR}{FS,GS}BASE instructions */ + #endif /* __LIBXC_CPUFEATURE_H */ diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index c91347867d..c0d446277a 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -466,6 +466,14 @@ static void xc_cpuid_pv_policy( set_bit(X86_FEATURE_HYPERVISOR, regs[2]); break; + case 7: + if ( input[1] == 0 ) + regs[1] &= bitmaskof(X86_FEATURE_FSGSBASE); + else + regs[1] = 0; + regs[0] = regs[2] = regs[3] = 0; + break; + case 0x0000000d: xc_cpuid_config_xsave(xch, domid, xfeature_mask, input, regs); break; @@ -612,7 +620,7 @@ int xc_cpuid_apply_policy(xc_interface *xch, domid_t domid) input[0] = 0x80000000u; input[1] = XEN_CPUID_INPUT_UNUSED; - if ( (input[0] == 4) || (input[0] == 0xd) ) + if ( (input[0] == 4) || (input[0] == 7) || (input[0] == 0xd) ) input[1] = 0; if ( (input[0] & 0x80000000u) && (input[0] > ext_max) ) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 0852ab2bd6..5a5bac36a6 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -813,6 +813,13 @@ static void pv_cpuid(struct cpu_user_regs *regs) __clear_bit(X86_FEATURE_X2APIC % 32, &c); __set_bit(X86_FEATURE_HYPERVISOR % 32, &c); break; + case 7: + if ( regs->ecx == 0 ) + b &= cpufeat_mask(X86_FEATURE_FSGSBASE); + else + b = 0; + a = c = d = 0; + break; case 0x80000001: /* Modify Feature Information. */ if ( is_pv_32bit_vcpu(current) ) -- 2.30.2